/*
    FreeRTOS V9.0.0 - 版权所有 (C) 2016 Real Time Engineers Ltd.
    保留所有权利

    请访问 http://www.FreeRTOS.org 以确保您使用的是最新版本。

    本文件是 FreeRTOS 发行版的一部分。

    FreeRTOS 是免费软件；您可以根据自由软件基金会发布的 GNU 通用公共许可证（版本 2）的条款对其进行修改和重新分发，
    并且 FreeRTOS 例外条款对其进行了修改。

    ***************************************************************************
    >>!   注意：对 GPL 的修改是为了允许您分发包含 FreeRTOS 的联合作品，而无需提供专有组件的源代码。!<<
    >>!   这些专有组件位于 FreeRTOS 内核之外。!<<
    ***************************************************************************

    FreeRTOS 按原样分发，不提供任何形式的担保；无论是明示的还是暗示的，包括但不限于适销性和特定用途适用性的担保。
    完整的许可证文本可在以下链接中找到：http://www.freertos.org/a00114.html

    ***************************************************************************
     *                                                                       *
     *    FreeRTOS 提供了完全免费但专业开发、健壮、严格质量控制、支持且跨平台的软件，它不仅是市场领导者，还是行业的事实标准。*
     *                                                                       *
     *    通过购买 FreeRTOS 教程书籍或参考手册，您可以快速入门，同时支持 FreeRTOS 项目：*
     *    http://www.FreeRTOS.org/Documentation                              *
     *                                                                       *
    ***************************************************************************

    http://www.FreeRTOS.org/FAQHelp.html - 遇到问题？请先阅读常见问题解答页面“我的应用程序无法运行，可能是什么原因？”。您是否定义了 configASSERT()？

    http://www.FreeRTOS.org/support - 为了回报您免费获得的高质量嵌入式软件，我们请求您通过参与支持论坛来帮助我们的全球社区。

    http://www.FreeRTOS.org/training - 投资培训可以让您的团队尽早尽可能地提高生产力。现在，您可以直接从 FreeRTOS 的创始人、
    Real Time Engineers Ltd 的首席执行官 Richard Barry 那里接受 FreeRTOS 培训。

    http://www.FreeRTOS.org/plus - FreeRTOS 生态系统产品精选，包括 FreeRTOS+Trace（不可或缺的生产力工具）、
    兼容 DOS 的 FAT 文件系统以及我们的小型线程感知 UDP/IP 协议栈。

    http://www.FreeRTOS.org/labs - 新 FreeRTOS 产品的孵化地。快来试试 FreeRTOS+TCP，我们新的开源 TCP/IP 协议栈。

    http://www.OpenRTOS.com - Real Time Engineers Ltd. 授权 High Integrity Systems Ltd. 以 OpenRTOS 品牌销售 FreeRTOS。
    低成本的 OpenRTOS 许可证提供票务支持、赔偿和商业中间件。

    http://www.SafeRTOS.com - High Integrity Systems 还提供了一个经过安全工程设计和独立 SIL3 认证的版本，
    适用于需要可证明可靠性的安全和关键任务应用。

    1 个制表符 == 4 个空格！
*/

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * 应用程序特定的定义。
 *
 * 这些定义应根据您的具体硬件和应用程序需求进行调整。
 *
 * 这些参数在 FreeRTOS API 文档的“配置”部分中有详细描述，文档可在 FreeRTOS.org 网站上找到。
 *
 * 参见 http://www.freertos.org/a00110.html。
 *----------------------------------------------------------*/

 /* 确保 stdint.h 仅由编译器使用，而不是汇编器。 */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;  // 系统时钟频率，通常由硬件提供
#endif

#define configUSE_PREEMPTION			1  // 启用抢占式调度
#define configUSE_IDLE_HOOK				0  // 禁用空闲任务钩子函数
#define configUSE_TICK_HOOK				0  // 禁用Tick钩子函数
#define configCPU_CLOCK_HZ				( SystemCoreClock )  // 系统时钟频率
#define configTICK_RATE_HZ				( ( TickType_t ) 1000 )  // Tick频率，设置为1000Hz（1ms一个Tick）
#define configMAX_PRIORITIES			( 5 )  // 最大任务优先级数
#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 130 )  // 最小任务堆栈大小
#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 75 * 1024 ) )  // 总堆大小，75KB
#define configMAX_TASK_NAME_LEN			( 10 )  // 任务名称的最大长度
#define configUSE_TRACE_FACILITY		1  // 启用跟踪功能
#define configUSE_16_BIT_TICKS			0  // 不使用16位Tick计数器
#define configIDLE_SHOULD_YIELD			1  // 空闲任务应让出CPU
#define configUSE_MUTEXES				1  // 启用互斥量
#define configQUEUE_REGISTRY_SIZE		8  // 队列注册表大小
#define configCHECK_FOR_STACK_OVERFLOW	0  // 禁用堆栈溢出检查
#define configUSE_RECURSIVE_MUTEXES		1  // 启用递归互斥量
#define configUSE_MALLOC_FAILED_HOOK	0  // 禁用内存分配失败钩子函数
#define configUSE_APPLICATION_TASK_TAG	0  // 禁用任务标签功能
#define configUSE_COUNTING_SEMAPHORES	1  // 启用计数信号量
#define configGENERATE_RUN_TIME_STATS	0  // 禁用运行时统计

/* 协程定义。 */
#define configUSE_CO_ROUTINES 		0  // 禁用协程
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )  // 协程的最大优先级数

/* 软件定时器定义。 */
#define configUSE_TIMERS				1  // 启用软件定时器
#define configTIMER_TASK_PRIORITY		( 2 )  // 定时器任务优先级
#define configTIMER_QUEUE_LENGTH		10  // 定时器队列长度
#define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 )  // 定时器任务堆栈深度

/* 将以下定义设置为 1 以包含 API 函数，或设置为 0 以排除 API 函数。 */
#define INCLUDE_vTaskPrioritySet		1  // 包含任务优先级设置函数
#define INCLUDE_uxTaskPriorityGet		1  // 包含获取任务优先级函数
#define INCLUDE_vTaskDelete				1  // 包含删除任务函数
#define INCLUDE_vTaskCleanUpResources	1  // 包含清理任务资源函数
#define INCLUDE_vTaskSuspend			1  // 包含挂起任务函数
#define INCLUDE_vTaskDelayUntil			1  // 包含延迟到指定时间函数
#define INCLUDE_vTaskDelay				1  // 包含延迟函数

/* Cortex-M 特定定义。 */
#ifdef __NVIC_PRIO_BITS
    /* 当使用 CMSIS 时，__NVIC_PRIO_BITS 会被定义。 */
#define configPRIO_BITS       		__NVIC_PRIO_BITS  // 中断优先级位数
#else
#define configPRIO_BITS       		4        /* 15 个优先级级别 */  // 默认4位优先级（15个优先级）
#endif

/* 可以在“设置优先级”函数中使用的最低中断优先级。 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			0xf  // 最低中断优先级

/* 任何调用中断安全 FreeRTOS API 函数的中断服务例程可以使用的中断优先级的最高值。
   不要从优先级高于此值的中断中调用中断安全的 FreeRTOS API 函数！
   （较高的优先级对应较低的数值。） */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5  // 最大系统调用中断优先级

   /* 内核端口层本身使用的中断优先级。这些定义适用于所有 Cortex-M 端口，不依赖于任何特定的库函数。 */
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  // 内核中断优先级
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY 不能设置为零 !!!!
参见 http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html。 */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  // 最大系统调用中断优先级

/* 正常的 assert() 语义，不依赖于 assert.h 头文件的提供。 */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }  // 断言宏，用于调试

/* 将 FreeRTOS 端口的中断处理程序映射到其 CMSIS 标准名称的定义。 */
#define vPortSVCHandler SVC_Handler  // SVC中断处理函数
#define xPortPendSVHandler PendSV_Handler  // PendSV中断处理函数
#define xPortSysTickHandler SysTick_Handler  // SysTick中断处理函数

#endif /* FREERTOS_CONFIG_H */